# check_jsonl.py
# usage: 检查jsonl的文件格式是否准确
# python ./src/tools/check_jsonl.py --file "./result/results.jsonl"

import json
import argparse

def validate_jsonl(file_path: str):
    valid_count = 0
    errors = []
    total_lines = 0  # 统计总行数（包含空行和无效行）

    # 第一步：先统计总行数（用于 expected_count）
    with open(file_path, "r", encoding="utf-8") as f:
        lines = f.readlines()

    expected_count = len([line.strip() for line in lines if line.strip()])  # 非空行数作为预期总数

    # 第二步：逐行验证内容
    for line_num, line in enumerate(lines, start=1):
        line = line.strip()
        if not line:
            continue  # 跳过空行

        total_lines += 1

        try:
            obj = json.loads(line)
        except json.JSONDecodeError as e:
            errors.append(f"第 {line_num} 行JSON解析失败,错误信息: {e}")
            continue

        # 检查必须字段 id 和 sql
        if "id" not in obj:
            errors.append(f"第 {line_num} 行缺少字段: id")
        if "sql" not in obj:
            errors.append(f"第 {line_num} 行缺少字段: sql")

        # 如果 id 存在，检查其值是否等于当前行号（假设 id 应该是从 1 开始递增，且等于行号）
        if "id" in obj:
            id_value = obj["id"]
            if id_value != line_num:
                errors.append(f"第 {line_num} 行 id 值错误: 当前行号为 {line_num}, 但 id 为 {id_value}")

        # 只有同时存在 id 和 sql 才算合法记录
        if "id" in obj and "sql" in obj:
            valid_count += 1

    print(f"总共应有 {expected_count} 条记录（非空行数）")
    print(f"合法的记录数: {valid_count}")

    if valid_count != expected_count:
        print(f"⚠️ 合法记录数 ({valid_count}) 不等于总非空行数 ({expected_count})")

    if errors:
        print("❌ 错误详情:")
        for err in errors:
            print(err)
    else:
        print("✅ 所有检查通过！")

    return valid_count, errors


def main():
    parser = argparse.ArgumentParser(description="检查指定jsonl文件格式")
    parser.add_argument('--file', type=str, required=True, help='要扫描的文件路径')

    args = parser.parse_args()
    validate_jsonl(args.file)


if __name__ == "__main__":
    main()